Skip to content

chore: unify ci timeouts to 4 tiers#7460

Merged
0ax1 merged 2 commits intodevelopfrom
chore/standardize-workflow-timeouts
Apr 16, 2026
Merged

chore: unify ci timeouts to 4 tiers#7460
0ax1 merged 2 commits intodevelopfrom
chore/standardize-workflow-timeouts

Conversation

@0ax1
Copy link
Copy Markdown
Contributor

@0ax1 0ax1 commented Apr 15, 2026

Audit all GitHub Actions workflow timeouts against actual run durations and consolidate to 4 consistent tiers:

  • 10 min: quick utility jobs (labels, lints, deploys, reports)
  • 30 min: standard CI build/test/lint, docs build
  • 120 min: heavy compute (benchmarks, packaging, publishing, fuzz-coverage)
  • 240 min: marathon fuzz runs and corpus minimization

Notably, fuzz-coverage was hitting its old 60-min timeout and getting cancelled on most runs — bumping to 120 fixes that.

Timeout tiers

Tier Timeout Purpose Safety margin
10 min Quick utility jobs (labels, lints, deploys, reports) ~100×+ over typical
🔨 30 min Standard CI build/test/lint, docs, packaging, publishing ~5× over slowest job in tier
🏋️ 120 min Heavy compute (benchmarks, python packaging, fuzz-coverage) ~2× over slowest job in tier
🔬 240 min Marathon fuzz runs and corpus minimization Matches libfuzzer/wasmfuzz time configs

Per-job breakdown

⚡ Tier 1 — 10 min

Workflow Job Previous timeout Max observed duration
approvals.yml check-approvals ❌ none (6h default) < 1 min
bench-dispatch.yml remove-bench-label 2 min < 1 min
bench-dispatch.yml remove-sql-label 2 min < 1 min
bench.yml commit-metadata 10 min < 1 min
ci.yml lint-toml 40 min ~9 sec
ci.yml validate-workflow-yaml 40 min ~8 sec
ci.yml python-lint 40 min ~39 sec
ci.yml cpp-lint 10 min ~8 sec
ci.yml ffi-c-test 10 min ~49 sec
docs.yml deploy 10 min ~31 sec
labels.yml check_changelog_label ❌ none < 1 min
package.yml prepare-all ❌ none < 1 min
publish-benchmarks-website.yml publish ❌ none < 1 min
release-drafter.yml update_release_draft ❌ none < 1 min
report-fuzz-crash.yml report 10 min < 1 min
reuse.yml reuse-check ❌ none < 1 min
stale.yml close-issues 10 min < 1 min
typos.yml spelling ❌ none < 1 min
web.yml changes ❌ none < 1 min
web.yml deploy 10 min < 1 min

🔨 Tier 2 — 30 min

Workflow Job Previous timeout Max observed duration
ci.yml python-test 40 min ~2 min 10 sec
ci.yml python-wheel-build 40 min ~2 min 44 sec
ci.yml rust-docs 40 min ~2 min 20 sec
ci.yml build-rust (all matrix entries) 40 min ~2 min 18 sec
ci.yml check-min-deps 40 min ~1 min 23 sec
ci.yml rust-lint 40 min ~2 min 22 sec
ci.yml rust-lint-no-default 40 min ~1 min 35 sec
ci.yml public-api 40 min ~1 min 17 sec
ci.yml rust-coverage 40 min ~4 min 47 sec
ci.yml rust-test-sanitizer 40 min ~3 min 19 sec
ci.yml rust-ffi-test-sanitizer 40 min ~1 min 16 sec
ci.yml cuda-build-lint 40 min ~3 min 9 sec
ci.yml cuda-test 30 min ~3 min 32 sec
ci.yml cuda-test-sanitizer 30 min ~3 min 14 sec
ci.yml cuda-test-cudf 30 min ~2 min
ci.yml rust-test-other (windows/arm64) 40 min ~5 min 58 sec
ci.yml build-java 40 min ~2 min 24 sec
ci.yml bench-codspeed (all shards) 40 min ~2 min 37 sec
ci.yml license-check-and-audit-check 40 min ~57 sec
ci.yml cxx-test 40 min ~1 min 28 sec
ci.yml sqllogic-test ❌ none (6h default) ~1 min 38 sec
ci.yml wasm-integration 40 min ~2 min 16 sec
ci.yml miri 40 min ~1 min 44 sec
ci.yml generated-files 40 min ~45 sec
ci.yml check-java-publish-build 40 min ~2 min 47 sec
ci.yml rust-publish-dry-run 40 min ~36 sec
close-fixed-fuzzer-issues.yml close-fixed 60 min ~2 min
compat-gen-upload.yml dry-run ❌ none ~3 min
compat-gen-upload.yml upload ❌ none ~1 min 18 sec
compat-validation.yml compat-test 120 min ~3 min 20 sec
docs.yml build 120 min ~15 min
package.yml prepare-java-macos ❌ none ~6 min
package.yml prepare-java-linux 120 min ~6 min 22 sec
publish.yml publish-rust 120 min ~1 min 37 sec
publish.yml publish-python 120 min ~34 sec
publish.yml publish-java 120 min ~10 min 12 sec
web.yml check 30 min ~3 min
web.yml build 30 min ~3 min

🏋️ Tier 3 — 120 min

Workflow Job Previous timeout Max observed duration
bench-pr.yml bench 120 min ~42 min
bench.yml bench 120 min ~42 min
claude.yml claude ❌ none variable (AI agent)
fuzz-coverage.yml coverage 60 min ⚠️ ~60 min (was hitting timeout!)
fuzzer-fix-automation.yml attempt-fix 90 min ~30 min
package.yml prepare-python 120 min ~40 min
release-binaries.yml build 120 min ~40 min
sql-benchmarks.yml bench 120 min ~60 min (nightly SF=100)

🔬 Tier 4 — 240 min

Workflow Job Previous timeout Max observed duration
run-fuzzer.yml fuzz 230 min ~50 min (libfuzzer max_total_time=2700s)
wasm-fuzz.yml wasm-fuzz 270 min up to 3h30m (wasmfuzz --timeout=3h30m)
minimize_fuzz_corpus_workflow.yml minimize ❌ none (6h default) variable

Also lowered wasmfuzz --timeout from 4h to 3h30m so the fuzz step itself fits within 240 min with ~30 min headroom for build/setup/teardown.

Notable fixes

  • fuzz-coverage was silently broken: the old 60-min timeout was being hit on 4 out of 5 recent runs (all cancelled at ~61 min). Bumping to 120 min fixes this.
  • 14 jobs had no timeout at all, defaulting to the GitHub Actions 6-hour maximum. All now have explicit timeouts.
  • sqllogic-test in CI had no timeout — now set to 30 min.

@0ax1 0ax1 requested a review from joseph-isaacs April 15, 2026 22:38
@0ax1 0ax1 changed the title chore: standardize workflow timeouts to 4 tiers (10/30/120/240) chore: unify ci timeouts to 4 tiers Apr 15, 2026
@0ax1 0ax1 added the changelog/chore A trivial change label Apr 15, 2026
@0ax1 0ax1 enabled auto-merge (squash) April 15, 2026 22:39
@0ax1 0ax1 force-pushed the chore/standardize-workflow-timeouts branch from 03ec740 to 9578df1 Compare April 15, 2026 22:40
@0ax1 0ax1 requested a review from robert3005 April 15, 2026 22:44
@0ax1 0ax1 disabled auto-merge April 15, 2026 22:46
Audit all GitHub Actions workflow timeouts against actual run durations and
consolidate from 9 different values (2, 10, 30, 40, 60, 90, 120, 230, 270)
down to 4 consistent tiers:

- 10 min: quick utility jobs (labels, lints, deploys, reports)
- 30 min: standard CI build/test/lint, docs build
- 120 min: heavy compute (benchmarks, packaging, publishing, fuzz-coverage)
- 240 min: marathon fuzz runs and corpus minimization

Also adds timeout-minutes to 14 jobs that previously had none (defaulting
to the GitHub Actions 6-hour maximum), including sqllogic-test in CI and
the fuzz corpus minimization job.

Notably, fuzz-coverage was hitting its old 60-min timeout and getting
cancelled on most runs — bumping to 120 fixes that.

Signed-off-by: Alexander Droste <alexander.droste@protonmail.com>
@0ax1 0ax1 force-pushed the chore/standardize-workflow-timeouts branch from 9578df1 to 6199963 Compare April 15, 2026 22:48
@0ax1 0ax1 enabled auto-merge (squash) April 15, 2026 22:53
@0ax1 0ax1 requested a review from AdamGS April 16, 2026 10:12
@0ax1 0ax1 merged commit 17e2801 into develop Apr 16, 2026
57 of 60 checks passed
@0ax1 0ax1 deleted the chore/standardize-workflow-timeouts branch April 16, 2026 10:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/chore A trivial change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants